package com.example.bmi;

import java.text.DecimalFormat;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


/*
 *  								[MEMO] Java中this、super用法簡談
 *  通過用static來定義方法或成員，爲我們編程提供了某種便利，
 *  從某種程度上可以說它類似于C語言中的全局函數和全局變量。
 *  但是，並不是說有了這種便利，你便可以隨處使用，如果那樣的話，你便需要認真考慮一下自己是否在用面向對象的思想編程，
 *  自己的程序是否是面向對象的。
 *  好了，現在開始討論 this&super這兩個關鍵字的意義和用法。

 *　								在Java中，this通常指當前對象，super則指父類別。
 *  當你想要引用當前對象的某種東西，比如當前對象的某個方法，或當前對象的某個成員，你便可以利用this來實現這個目的。
 *  當然，this的另一個用途是調用當前對象的另一個 構造函數，這些馬上就要討論。
 *  如果你想引用父類的某種東西，則非super莫屬。

 *     由於this與super有如此相似的一些特性和與生俱來的某種關系，所 以我們在這一塊兒來討論，
 *     希望能幫助你區分和掌握它們兩個。
 *　　在一般方法中最普遍的情況就是，在你的方法中的某個形參名與當前對象 的某個成員有相同的名字，
 *   這時爲了不至于混淆，你便需要明確使用this關鍵字來指明你要使用某個成員，使用方法是“this.成員名”，
 *   而不帶this 的那個便是形參。另外，還可以用“this.方法名”來引用當前對象的某個方法，但這時this就不是必須的了，
 *   你可以直接用方法名來訪問那個方法，編譯 器會知道你要調用的是那一個。下面的代碼演示了上面的用法：
 *  ==============================================================
 *  public class DemoThis
 *  {     
 *  	private String name; 
 *  	private int age; 
 *  
 *  	DemoThis(String name,int age)
 *  	{ 
 *  		setName(name); 
 *  		//你可以加上this來調用方法，像這樣：this.setName(name);但這並不是必須的  
 *  		setAge(age);
 *  		this.print(); 
 *  	} 
 *  
 *  	public void setName(String name)
 *  	{  
 *  		this.name=name;  
 *  		//此處必須指明你要引用成員變量   
 *　　	} 
 *
 *		public void etAge(int age)
 *		{
 *　			this.age=age;
 *　		}
 *
 *　		public void print()
 *		{
 *　			System.out.println("Name="+name+" ge="+age);
 * 			//在此行中並不需要用this，因爲沒有會導致混淆的東西
 * 		}
 * 
 * 		public static void main(String[] args)
 * 		{
 * 			DemoThis dt=new DemoThis("Kevin","22");
 * 			==============================================================
 * 			這段代碼很簡單，不用解釋你也應該能看明白。在構造函數中你看到用this.print(),
 * 			你完全可以用print()來代替它，兩者效果一樣。下面我們修改這個程序，來演示super的用法。
 * 			==============================================================
 * 		}
 * 
 * class Person
 * {
 * 		public int c; 
 * 		private String name;
 *  
 * 		private int age; protected void setName(String name)
 * 		{
 * 			this.name=name;
 * 　　	}
 * 
 * 		protected void setAge(int age)
 * 		{
 * 			this.age=age;
 * 		} 
 * 		
 * 		protected void print()
 * 		{
 * 			System.out.println("Name="+name+" Age="+age); }}public class DemoSuper extends Person
 * 			{
 * 				public void print()
 * 				{
 * 					System.out.println("DemoSuper:");
 * 					super.print();
 * 				}
 * 
 * 				public static void main(String[] args)
 * 				{
 * 					DemoSuper ds=new DemoSuper();
 * 					ds.setName("kevin");
 * 					ds.setAge(22);
 * 					ds.print();
 * 				}
 * 			}
 * 	}
 * 
 * ==============================================================
 * 在DemoSuper中，重新定義的print方法覆寫了父類的print方法，它首先做一些自己的事情，然後調用父類的那個被覆寫了的方法。輸出結果說明了這一點：
 * DemoSuper:Name=kevin Age=22
 * 這樣的使用方法是比較常用的。另外如果父類的成員可以被子類訪問，那你可以像使用this一樣使用它，用“super.父類中的成員名”的方式，但常常你並不是這樣來訪問父類中的成員名的。
 * 在構造函數中構造函數是一種特殊的方法，在對象初始化的時候自動調用。在構造函數中，this和super也有上面說的種種使用方式，並且它還有特殊的地方，請看下面的例子：
 * ==============================================================
 * 
 * class Person
 * {
 *		public static void prt(String s)
 * 		{
 * 			System.out.println(s);
 * 		}
 * 		
 * 		Person()
 * 		{
 * 			prt("A Person."); 
 * 		}
 * 		
 * 		Person(String name)
 * 		{
 * 			prt("A person name is:"+name); 
 * 		}
 * 
 * 	}
 * 
 * public class Chinese extends Person
 * {
 * 　　	Chinese()
 * 		{
 * 			super();
 * 			//調用父類構造函數（1）
 * 			prt("A chinese.");//(4)
 *		}
 *
 *		Chinese(String name)
 *		{
 *			super(name);
 *			//調用父類具有相同形參的構造函數（2）
 *			prt("his name is:"+name);
 *		}
 *
 *		Chinese(String name,int age)
 *		{
 *			this(name);
 *			//調用當前具有相同形參的構造函數（3）
 *			prt("his age is:"+age); 
 *		}
 *		
 *		public static void main(String[] args)
 *		{
 *			Chinese cn=new Chinese();
 *			cn=new Chinese("kevin");
 *			cn=new Chinese("kevin",22);
 *		}
 *	}
 *
 *==============================================================
 *　　在這段程序中，this和super不再是像以前那樣用“.”連接一個方法或成員，而是直接在其後跟上適當的參數，
 * 因此它的意義也就有了變化。 super後加參數的是用來調用父類中具有相同形式的構造函數，如1和2處。this後加參數則調用的是當前具有相同參數的構造函數，
 * 如3處。當然，在 Chinese的各個重載構造函數中，this和super在一般方法中的各種用法也仍可使用，比如4處，你可以將它替換爲“this.prt”(因爲它繼承了父類中的那個方法）或者是“super.prt”（因爲它
 * 是父類中的方法且可被子類訪問），它照樣可以正確運行。但這樣似乎就有點畫蛇添足的味道了。
 * 最後，寫了這麽多，如果你能對“this通常指代當前對象，super通常指代父類”這句話牢記在心，那麽本篇便達到了目的，其它的你自會在以後的編程實踐當中慢慢體會、掌握。另外關于本篇中提到的繼承，請參閱相關Java教程。
 * (王朝網絡 wangchao.net.cn)
 */
public class MainActivity extends Activity 
{
	private Button btnCalculaterBMI;
	private EditText EtxtHeight;
	private EditText EtxtWidth;
	private TextView txtvResult;
	private TextView txtvSuggest;
	
	private void FindViews()
	{
		btnCalculaterBMI = (Button)findViewById(R.id.btnCaculater);
		EtxtHeight = (EditText)findViewById(R.id.txtHeight);
		EtxtWidth = (EditText)findViewById(R.id.txtWidth);
		txtvResult = (TextView)findViewById(R.id.txtVWidth);
		txtvSuggest = (TextView)findViewById(R.id.txtVMessage);
	}
	

    private Button.OnClickListener calculaterBMI = new Button.OnClickListener()
	{
    	public void onClick(View arg0)
    	{
			DecimalFormat nf = new DecimalFormat("0.00");
			double dblHeight = Double.parseDouble(EtxtHeight.getText().toString());
			double dblWidth = Double.parseDouble(EtxtWidth.getText().toString());
			double dblBMI = dblWidth/(dblHeight*dblHeight);
			
			txtvResult.setText(getText(R.id.txtVWidth));
			
			if(dblBMI>25)
			{
				txtvSuggest.setText("BMI>25");
			}
			else if(dblBMI<20)
			{
				txtvSuggest.setText("BMI<20");
			}
			else
			{
				txtvSuggest.setText("Normal");	
			}
    	}
	};
	
	private void setListensers()
	{
		btnCalculaterBMI.setOnClickListener(calculaterBMI);
	}



	@Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
   
}
